<?php
// +----------------------------------------------------------------------
// | Description: 商城接口
// +----------------------------------------------------------------------
// | Author: zl
// +----------------------------------------------------------------------

namespace app\crm\controller;

use app\crm\model\Customer as CustomerModel;
use app\mini\model\PersonCustomer;
use app\crm\model\TransferShop;
use think\facade\Db;
use app\Request;
use think\Env;

class ProductItemType
{
     /**
     * 获取三级联动分类数据
     */
    public function getProductType(Request $request)
    {
        $param = $request->param();
        $where = [];
        
        if(empty($param['status']))
        {
            $where[] = ['status', '=', 1];
        }
        
        if($param['type'] == 'name')
        {
            // 查询所有分类数据
            $categories = Db::name('item_type')
                ->field('id,pid,name,level')
                ->where($where)  // 只查询启用状态的分类
                ->order('sort asc')   // 按排序权重排序
                ->select()
                ->toArray();
        }elseif($param['type'] == 'all')
        {
            // 查询所有分类数据
            $categories = Db::name('item_type')
                ->where($where)  // 只查询启用状态的分类
                ->order('sort asc')   // 按排序权重排序
                ->select()
                ->toArray();
                
            // 转换时间戳为日期格式
            $categories = array_map(function($item) {
                $item['create_time'] = $item['create_time'] ? date('Y-m-d H:i:s', $item['create_time']) : '';
                $item['update_time'] = $item['update_time'] ? date('Y-m-d H:i:s', $item['update_time']) : '';
                return $item;
            }, $categories);
        }
            
        // 构建树形结构
        $tree = $this->buildTree($categories);
        
        return json([
            'code' => 200,
            'msg' => '获取成功',
            'data' => $tree
        ]);
    }
    
    
    /**
     * 获取三级联动分类数据
     */
    public function getLevelList(Request $request)
    {
        $param = $request->param();
        
        if ($param['level'] == 'one') {
            $list = Db::name('item_type')
                ->field('id,name,pid,level')
                ->where('status', 1)
                ->where('level', 1)
                ->select()
                ->toArray();
        } elseif ($param['level'] == 'two') {
            // 步骤1：查询所有启用的二级分类
            $level2Items = Db::name('item_type')
                ->field('id,name,pid,level')
                ->where('status', 1)
                ->where('level', 2)
                ->select()
                ->toArray();
            
            if (empty($level2Items))
            {
                return json(['code' => 200, 'msg' => '获取成功', 'data' => []]);
            }
            
            // 步骤2：提取所有二级分类的父级ID（一级分类ID）
            $parentIds = array_unique(array_column($level2Items, 'pid'));
            
            // 步骤3：查询这些父级ID对应的一级分类
            $level1Items = Db::name('item_type')
                ->field('id,name,pid,level')
                ->where('status', 1)
                ->where('level', 1)
                ->where('id', 'in', $parentIds)
                ->select()
                ->toArray();
            
            // 步骤4：合并一级和二级分类数据
            $allItems = array_merge($level1Items, $level2Items);
            
            // 步骤5：构建树形结构
            $list = $this->buildTreeTwo($allItems);
        }
        
        return json(['code' => 200, 'msg' => '获取成功', 'data' => $list]);
    }
    
    
    
    //单独搜索某级分类
    public function getItemByLevel(Request $request)
    {
        $param = $request->param();
        
        $where = [];
        if (!empty($param['level']))
        {
            $where[] = ['level','=',$param['level']];
        }
        
        $list = Db::name('item_type')
            ->field('id,name,pid,level')
            ->where('status', 1)
            ->where($where)
            ->select()
            ->toArray();
        
        return json(['code' => 200, 'msg' => '获取成功', 'data' => $list]);
    }
    
    
    /**
     * 添加分类
     */
    public function addProductType(Request $request)
    {
        $param = $request->param();
        $param['create_time'] = time();
        
        // 检查同等级下是否存在同名分类
        $exists = Db::name('item_type')
            ->where('name', $param['name'])
            ->where('level', $param['level'])
            ->count();
            
        if ($exists)
        {
            return json(['code' => 0, 'msg' => '该等级下已存在同名分类']);
        }
        
        $id = Db::name('item_type')->insertGetId($param);
        
        if ($id)
        {
            return json(['code' => 200, 'msg' => '添加成功', 'data' => ['id' => $id]]);
        }else
        {
            return json(['code' => 0, 'msg' => '添加失败']);
        }
    }
    
    
    
    
    /**
     * 修改分类
     */
    public function editProductType(Request $request)
    {
        $param = $request->param();
        $id = $param['id'];
        // 验证ID
        if (empty($id))
        {
            return json(['code' => 0, 'msg' => 'ID不能为空']);
        }
        
        // 移除不允许更新的字段
        unset($param['id']); // 不允许修改ID
        unset($param['create_time']); // 通常不允许修改创建时间
        $param['update_time'] = time(); // 更新时间戳
        
        // 如果修改了名称或等级，检查是否存在同名同等级分类
        if (isset($param['name']) || isset($param['level']))
        {
            $name = isset($param['name']) ? $param['name'] : Db::name('item_type')->where('id', $id)->value('name');
            $level = isset($param['level']) ? $param['level'] : Db::name('item_type')->where('id', $id)->value('level');
            
            $exists = Db::name('item_type')
                ->where('name', $name)
                ->where('level', $level)
                ->where('id', '<>', $id) // 排除当前记录
                ->count();
                
            if ($exists)
            {
                return json(['code' => 0, 'msg' => '该等级下已存在同名分类']);
            }
        }
        
        // 更新数据库
        $result = Db::name('item_type')
            ->where('id', $id)
            ->update($param);
            
        if ($result !== false)
        {
            return json(['code' => 200, 'msg' => '修改成功']);
        }else
        {
            return json(['code' => 0, 'msg' => '修改失败']);
        }
    }
    
    
    
    
    
    /**
     * 递归构建树形结构，并添加父级分类ID字段
     */
    private function buildTree($items, $pid = 0)
    {
        $tree = [];
        
        foreach ($items as $item) {
            if ($item['pid'] == $pid) {
                // 递归查找子节点
                $children = $this->buildTree($items, $item['id']);
                if (!empty($children)) {
                    $item['children'] = $children;
                }
                
                // 添加父级分类ID字段
                if ($item['level'] == 2) {
                    // 二级分类：添加one_type（一级父级ID）
                    $item['one_type'] = $item['pid'];
                } elseif ($item['level'] == 3) {
                    // 三级分类：添加one_type（一级父级ID）和two_type（二级父级ID）
                    $parentId = $item['pid']; // 二级父级ID
                    $grandParentId = null;
                    
                    // 查找二级父级的父级（一级父级）
                    foreach ($items as $parentItem) {
                        if ($parentItem['id'] == $parentId) {
                            $grandParentId = $parentItem['pid'];
                            break;
                        }
                    }
                    
                    $item['one_type'] = $grandParentId;
                    $item['two_type'] = $parentId;
                }
                
                $tree[] = $item;
            }
        }
        return $tree;
    }
    
    
    /**
     * 递归构建树形结构
     */
    private function buildTreeTwo($items, $pid = 0)
    {
        $tree = [];
        foreach ($items as $item) {
            if ($item['pid'] == $pid) {
                // 递归查找子节点
                $children = $this->buildTree($items, $item['id']);
                if (!empty($children)) {
                    $item['children'] = $children;
                }
                $tree[] = $item;
            }
        }
        return $tree;
    }
    
   
    
    protected function getCustomerModel()
    {
        return new CustomerModel();
    }
    protected function getPersonCustomer()
    {
        return new PersonCustomer();
    }
}